<!DOCTYPE html>
<html>
<head>
<title>Mybatis</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
/* Author: Nicolas Hery - http://nicolashery.com */
/* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
/* Source: https://github.com/nicolahery/markdownpad-github */

/* RESET
=============================================================================*/

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
}

/* BODY
=============================================================================*/

body {
  font-family: Helvetica, arial, freesans, clean, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  color: #333;
  background-color: #fff;
  padding: 20px;
  max-width: 960px;
  margin: 0 auto;
}

body>*:first-child {
  margin-top: 0 !important;
}

body>*:last-child {
  margin-bottom: 0 !important;
}

/* BLOCKS
=============================================================================*/

p, blockquote, ul, ol, dl, table, pre {
  margin: 15px 0;
}

/* HEADERS
=============================================================================*/

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
}

h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
  font-size: inherit;
}

h1 {
  font-size: 28px;
  color: #000;
}

h2 {
  font-size: 24px;
  border-bottom: 1px solid #ccc;
  color: #000;
}

h3 {
  font-size: 18px;
}

h4 {
  font-size: 16px;
}

h5 {
  font-size: 14px;
}

h6 {
  color: #777;
  font-size: 14px;
}

body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
  margin-top: 0;
  padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0;
}

h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
  margin-top: 10px;
}

/* LINKS
=============================================================================*/

a {
  color: #4183C4;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

/* LISTS
=============================================================================*/

ul, ol {
  padding-left: 30px;
}

ul li > :first-child, 
ol li > :first-child, 
ul li ul:first-of-type, 
ol li ol:first-of-type, 
ul li ol:first-of-type, 
ol li ul:first-of-type {
  margin-top: 0px;
}

ul ul, ul ol, ol ol, ol ul {
  margin-bottom: 0;
}

dl {
  padding: 0;
}

dl dt {
  font-size: 14px;
  font-weight: bold;
  font-style: italic;
  padding: 0;
  margin: 15px 0 5px;
}

dl dt:first-child {
  padding: 0;
}

dl dt>:first-child {
  margin-top: 0px;
}

dl dt>:last-child {
  margin-bottom: 0px;
}

dl dd {
  margin: 0 0 15px;
  padding: 0 15px;
}

dl dd>:first-child {
  margin-top: 0px;
}

dl dd>:last-child {
  margin-bottom: 0px;
}

/* CODE
=============================================================================*/

pre, code, tt {
  font-size: 12px;
  font-family: Consolas, "Liberation Mono", Courier, monospace;
}

code, tt {
  margin: 0 0px;
  padding: 0px 0px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px;
}

pre>code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent;
}

pre {
  background-color: #f8f8f8;
  border: 1px solid #ccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px;
}

pre code, pre tt {
  background-color: transparent;
  border: none;
}

kbd {
    -moz-border-bottom-colors: none;
    -moz-border-left-colors: none;
    -moz-border-right-colors: none;
    -moz-border-top-colors: none;
    background-color: #DDDDDD;
    background-image: linear-gradient(#F1F1F1, #DDDDDD);
    background-repeat: repeat-x;
    border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
    border-image: none;
    border-radius: 2px 2px 2px 2px;
    border-style: solid;
    border-width: 1px;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    line-height: 10px;
    padding: 1px 4px;
}

/* QUOTES
=============================================================================*/

blockquote {
  border-left: 4px solid #DDD;
  padding: 0 15px;
  color: #777;
}

blockquote>:first-child {
  margin-top: 0px;
}

blockquote>:last-child {
  margin-bottom: 0px;
}

/* HORIZONTAL RULES
=============================================================================*/

hr {
  clear: both;
  margin: 15px 0;
  height: 0px;
  overflow: hidden;
  border: none;
  background: transparent;
  border-bottom: 4px solid #ddd;
  padding: 0;
}

/* TABLES
=============================================================================*/

table th {
  font-weight: bold;
}

table th, table td {
  border: 1px solid #ccc;
  padding: 6px 13px;
}

table tr {
  border-top: 1px solid #ccc;
  background-color: #fff;
}

table tr:nth-child(2n) {
  background-color: #f8f8f8;
}

/* IMAGES
=============================================================================*/

img {
  max-width: 100%
}
</style>
<script type="text/javascript">
  document.addEventListener("DOMContentLoaded", function() {

    // 生成目录列表
    var div1 = document.createElement("div");
    div1.style.cssText = "clear:both";
    var outline = document.createElement("div");
    outline.setAttribute("id", "outline-list");
    outline.style.cssText = "border:solid 1px #ccc; background:#eee; min-width:200px;padding:4px 10px;";

    var ele_p = document.createElement("p");
    ele_p.style.cssText = "text-align: left; margin: 0;";
    outline.appendChild(ele_p);

    var ele_span = document.createElement("span");
    // ele_span.style.cssText = "float: left;";
    var ele_text=document.createTextNode("目录");
    ele_span.appendChild(ele_text);

    var ele_a = document.createElement("a");
    ele_a.appendChild(document.createTextNode("[+]"));
    ele_a.setAttribute("href", "#");
    ele_a.setAttribute("onclick", "javascript:return openct(this);");
    ele_a.setAttribute("title", "点击打开目录");

    ele_span.appendChild(ele_a);
    ele_p.appendChild(ele_span);

    var ele_ol = document.createElement("ol");
    ele_ol.style.cssText = "display:none;margin-left:14px;padding-left:14px;line-height:160%;";
    ele_ol.setAttribute("id", "outline_ol");
    outline.appendChild(ele_ol);
    var div1 = document.createElement("div");
    div1.style.cssText = "clear:both";

    document.body.insertBefore(outline, document.body.childNodes[0]);
    // 获取所有标题
    var headers = document.querySelectorAll('h1,h2,h3,h4,h5,h6');
    if (headers.length < 2)
      return;

    // -----
    var old_h = 0, ol_cnt = 0;
    // -----

    for (var i = 0; i < headers.length; i++) {

      var ele_ols = null;
      var ele_Current = ele_ol;
      // 找出它是H几，为后面前置空格准备
      var header = headers[i];
      header.setAttribute("id", "t" + i + header.tagName);
      var h = parseInt(header.tagName.substr(1), 10);

      // -----
      if (!old_h){
        old_h = h;

      }

      if (h > old_h) {

        ele_ols = document.createElement("ol");
        ele_Current = ele_ol;
        if(ele_Current && ol_cnt > 0){
          var temp = ol_cnt;
          while(temp > 0){
            ele_Current = ele_Current.lastChild;
            temp--;
          }
        }
        ele_Current.lastChild.appendChild(ele_ols);
        ol_cnt++;
      } else if (h < old_h && ol_cnt > 0) {

        if (h == 1) {
          while (ol_cnt > 0) {
            ol_cnt--;
          }
        } else {
          ele_ols = document.createElement("ol");
          ele_Current = ele_ol;
          if(ele_Current && ol_cnt > 0){
            var temp = ol_cnt;
            while(temp > 1){
              ele_Current = ele_Current.lastChild;
              temp--;
            }
          }
        // var ele_Parent = ele_Current.parentNode();
        //ele_Current.appendChild(ele_ols);
        ol_cnt--;

        }
      } else if (h == old_h && ol_cnt > 0) {

        ele_Current = ele_ol;
        if(ele_Current && ol_cnt > 0){
          var temp = ol_cnt;
          while(temp > 0){
            ele_Current = ele_Current.lastChild;
            temp--;
          }
        }
        ele_Current = ele_Current.lastChild;
      }
      if (h == 1) {
        while (ol_cnt > 0) {
          ol_cnt--;
        }
      }
      if (h < old_h && ol_cnt > 0 && h != 1){
        ele_li = document.createElement("li")
        ele_Current.lastChild.appendChild(ele_li);
        old_h = h;
        var a = document.createElement("a");
        // 为目录项设置链接
        a.setAttribute("href", "#t" + i + header.tagName);
        // 目录项文本前面放置对应的空格
        a.innerHTML = header.textContent;
        ele_li.appendChild(a);
        continue;
      }

      old_h = h;
      // -----
      if (ele_ols){
        ele_li = document.createElement("li")
        ele_ols.appendChild(ele_li); 
      } else {
        ele_li = document.createElement("li")
        ele_Current.appendChild(ele_li);
      }
      var a = document.createElement("a");
      // 为目录项设置链接
      a.setAttribute("href", "#t" + i + header.tagName);
      // 目录项文本前面放置对应的空格
      a.innerHTML = header.textContent;
      ele_li.appendChild(a);
    }
    // -----
    while (ol_cnt > 0) {
      ol_cnt--;
    }
    // -----
    });
function openct(e) {
  if (e.innerHTML == '[+]') {
    // createTextNode
    e.setAttribute('title', '收起');
    e.innerHTML = '[-]';
    var element = document.getElementById("outline_ol");
    element.style.cssText = "margin-left:14px;padding-left:14px;line-height:160%;";
  } else {
    e.setAttribute('title', '展开');
    e.innerHTML = '[+]';
    var element = document.getElementById("outline_ol");
    element.style.cssText = "display:none;margin-left:14px;padding-left:14px;line-height:160%;";
  }
  e.blur();
  return false;
}
</script>
</head>
<body>
<h1>MyBatis-day01</h1>
<h2>(1)MyBatis是什么?</h2>
<pre><code>开源的持久层框架
注：底层仍然是jdbc。
jdbc   速度快，易掌握，要写sql,代码繁琐
mybatis 速度适中　易掌握，要写sql,代码简洁
hibernate 速度慢，比较难掌握，不用写sql,代码简洁
            如果业务复杂，经常需要优化sql
</code></pre>

<h2>(2)如何使用MyBatis?</h2>
<pre><code>step1. 导包
    mybatis,ojdbc,junit
step2. 添加mybatis配置文件
    注：
        主要是连接池的配置和映射文件的位置。
        mybatis自带了一个连接池。
step3. 实体类
    注：
        属性名要与表的字段名一样（忽略大小写） 
step4. 添加映射文件
    注：
        主要是一些sql语句
step5. 修改配置文件，指定映射文件的位置。    
step6. 调用MyBatis的api来访问数据库。
</code></pre>

<h2>　(3)工作原理(了解)</h2>
<p><img src="day01-a2.png" />			</p>
<h2>(4)获得Map类型的结果</h2>
<pre><code>MyBatis在查询时，会将记录中的数据先存放到一个Map对象里面（
以字段名作为key,以字段值作为value）,接下来，再将Map对象
中的数据添加到实体对象里面。
获得Map类型的结果，指的是获得这个Map对象（这样，可以不用写
实体类）。
注：
    实际使用当中，建议还是获得实体对象,这样获取数据时更方便。
</code></pre>

<p><img src="day01-a3.png" /></p>
<h2>(5)解决表的字段名与实体类的属性名不一致的情况</h2>
<pre><code>1)方式一　使用别名
    注：将别名设置成与属性名一样。
2)方式二　使用resultMap
</code></pre>

<p><img src="day01-a4.png" />	</p>
<h2>(6)Mapper映射器</h2>
<h3>　1)Mapper映射器是什么?</h3>
<pre><code>是一个符合映射文件要求的接口。
注：MyBatis会生成一个符合该接口要求的对象。   
</code></pre>

<h3>2)如何使用Mapper映射器</h3>
<pre><code>step1.写一个接口
a.　方法名要与映射文件当中的sqlId一样。
b.  参数类型要与映射文件当中的parameterType一样。
c.  返回类型要与映射文件当中的resultType一样。
</code></pre>

<p><img src="day01-a5.png" />	</p>
<pre><code>step2.修改映射文件
    将namespace设置为接口名（要写接口的完整的名字)
</code></pre>

<p><img src="day01-a6.png" />	</p>
<pre><code>step3.调用SqlSession对象的getMapper方法来获得映射器的实现
</code></pre>

<p><img src="day01-a7.png" />					</p>
<h1>MyBatis-day02</h1>
<h2>1. Spring集成MyBatis</h2>
<h3>(1)集成方式一　（使用Mapper映射器）</h3>
<pre><code>step1.导包
    spring-webmvc,mybatis,mybatis-spring
    ojdbc,dbcp,spring-jdbc,junit
</code></pre>

<p><img src="day02-day08.png" /></p>
<pre><code>step2.添加Spring配置文件
    注：不再需要MyBatis的配置文件，MyBatis相关的配置用一个
    bean来代替（SqlSessionFactoryBean）。
step3.配置SqlSessionFactoryBean
</code></pre>

<p><img src="day02-a2.png" /></p>
<pre><code>step4.实体类
step5.映射文件
step6.Mapper映射器
step7.配置MapperScannerConfigurer。
    注：会扫描指定包及其子包下面的所有的Mapper映射器，
    然后调用SqlSession的getMapper方法（该方法会返回
    符合Mapper映射器要求的对象），并且将这些对象添加到
    Spring容器里面（默认的id是首字母小写之后的接口名）。
</code></pre>

<p><img src="day02-a1.png" />
<img src="day02-a3.png" /></p>
<pre><code>step8.启动Spring容器，获得DAO对象。

注：如果只扫描特定的接口
    step1. 开发一个注解
    step2. 将该注解添加到要扫描的接口之上
</code></pre>

<p><img src="day02-a5.png" /></p>
<pre><code>    step3. 修改MapperScannerConfigurer的配置 
</code></pre>

<p><img src="day02-a4.png" />	</p>
<h3>(2)集成方式二　（不使用Mapper映射器）</h3>
<pre><code>注：方式二是早期的一种集成方式，使用较少。
step1.导包
    spring-webmvc,mybatis,mybatis-spring
    ojdbc,dbcp,spring-jdbc,junit
step2.添加Spring配置文件。
step3.配置SqlSessionFactoryBean。
step4.实体类。
step5.映射文件。
        注：namespace没有要求。
step6.DAO接口
        注：不要求与映射文件一致。
step7.写DAO实现类
        注：　注入SqlSessionTemplate
        (SqlSessionTemplate封装了对SqlSession的操作)。
</code></pre>

<p><img src="day02-a6.png" />	
<img src="day02-a7.png" />	</p>
<pre><code>step8.启动Spring容器，获得DAO对象。
        注：不要忘记添加组件扫描。



SpringMVC + Spring + MyBatis完成登录

step1.添加一些包 (mybatis,mybatis-spring)
step2.在Spring配置当中，添加SqlSessionFactoryBean
    的配置，注意mapperLocations的值。
step3.实体类User( 不用写了，但是要注意属性名与
    表的字段名不一致。建议使用别名)
step4.添加userMapper.xml。
    namespace=&quot;cn.tedu.ems.dao.UserDAO&quot;
    &lt;select id=&quot;findByUsername&quot; 
        parameterType=&quot;java.lang.String&quot;
        resultType=&quot;cn.tedu.ems.entity.User&quot;&gt;
        SELECT password pwd...
    &lt;/select&gt;
step5.Mapper映射器(不用写了，UserDAO就是)
step6.配置MapperScannerConfigurer
step7.测试UserDAO
step8.测试整个登录            
</code></pre>


</body>
</html>
<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->
